package com.shuoyue.ycgk.utils;

import android.os.Message;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.zip.GZIPInputStream;
import java.util.zip.GZIPOutputStream;

public class StringZip {
    public static void main(String[] args) throws Exception {
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 100; i++) {
            value.append("java gzip 压缩测试");
        }
        //字符串压缩为byte数组
        byte[] values = value.toString().getBytes();
        System.out.println("解压前大小" + values.length);
        values = compress(values);
        System.out.println("解压后大小" + values.length);
        //把压缩后的byte数组转为字符串
        String str = new String(values, "iso8859-1");

        //传输字符串
        System.out.println(str);

        //将接受到的字符串转换为byte数组
        values = str.getBytes("iso8859-1");
        //解压缩这个byte数组
        values = decompress(values);
        System.out.println(new String(values, "utf-8"));

    }

    /**
     * 数据解压缩
     *
     * @param data
     * @return
     * @throws Exception
     */
    public static byte[] decompress(byte[] data) throws Exception {
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // 解压缩

        decompress(bais, baos);

        data = baos.toByteArray();

        baos.flush();
        baos.close();

        bais.close();

        return data;
    }

    /**
     * 数据解压缩
     *
     * @param is
     * @param os
     * @throws Exception
     */
    public static void decompress(InputStream is, OutputStream os)
            throws Exception {

        GZIPInputStream gis = new GZIPInputStream(is);

        int count;
        byte data[] = new byte[BUFFER];
        while ((count = gis.read(data, 0, BUFFER)) != -1) {
            os.write(data, 0, count);
        }

        gis.close();
    }

    public static byte[] compress(byte[] data) throws Exception {
        ByteArrayInputStream bais = new ByteArrayInputStream(data);
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // 压缩
        compress(bais, baos);

        byte[] output = baos.toByteArray();

        baos.flush();
        baos.close();

        bais.close();

        return output;
    }

    static final int BUFFER = 10240;

    /**
     * 数据压缩
     *
     * @param is
     * @param os
     * @throws Exception
     */
    public static void compress(InputStream is, OutputStream os)
            throws Exception {

        GZIPOutputStream gos = new GZIPOutputStream(os);

        int count;
        byte data[] = new byte[BUFFER];
        while ((count = is.read(data, 0, BUFFER)) != -1) {
            gos.write(data, 0, count);
        }

        gos.finish();

        gos.flush();
        gos.close();
    }
    //解压代码
    public void receievmessage(Socket socket){
        try{
            while(true){
                DataInputStream input = new DataInputStream(socket.getInputStream());
                byte[] buffer;
                //读取input中没有读取的字节
                buffer = new byte[input.available()];
                int len;
                if(buffer.length != 0){
                    System.out.println("获取到字节");
                    GZIPInputStream gzip =new GZIPInputStream(input);
                    // 读取缓冲区
                    len= gzip.read(buffer);
                    System.out.println("接收的长度: "+len);
                    char[] tChars=new char[300];
                    for(int i=0;i<len;i++)
                    {   tChars[i]=(char)buffer[i];  }
                    StringBuffer  tStringBuf=new StringBuffer ();
                    tStringBuf.append(tChars);

                    System.out.println("接收的内容是: "+ tStringBuf);
                    // System.out.println("接收的长度: "+buffer);
                    // String message = new String(buffer, "utf-8");//注意转码，不然中文会乱码。
                    //  Message m = new Message();
                    //  m.what = 3;
                    //  m.obj = message;
                    //handler.sendMessage(m);
                }
            }

        }catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
            Message m = new Message();
            m.what = 2;
//            handler.sendMessage(m);
        }
    }
}
